package org.goodsmanager.entity;

import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import jakarta.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;

/**
 * 商品实体类
 *
 * @author Goods Manager System
 * @version 1.0.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 商品ID（UUID）
     */
    private String id;

    /**
     * 商品名称
     */
    @NotBlank(message = "商品名称不能为空")
    @Size(max = 100, message = "商品名称不能超过100个字符")
    private String productName;

    /**
     * 商品编码
     */
    @NotBlank(message = "商品编码不能为空")
    @Pattern(regexp = "^[A-Z0-9-]{1,50}$", message = "商品编码格式不正确")
    private String productCode;

    /**
     * 分类ID
     */
    @NotBlank(message = "分类不能为空")
    private String categoryId;

    /**
     * 分类名称（关联查询）
     */
    @JSONField(serialize = true, deserialize = true)
    private String categoryName;

    /**
     * 品牌
     */
    @Size(max = 50, message = "品牌名称不能超过50个字符")
    private String brand;

    /**
     * 规格
     */
    @Size(max = 100, message = "规格不能超过100个字符")
    private String specification;

    /**
     * 单位
     */
    @Size(max = 20, message = "单位不能超过20个字符")
    private String unit;

    /**
     * 进货价
     */
    @DecimalMin(value = "0.00", message = "进货价不能小于0")
    private BigDecimal purchasePrice;

    /**
     * 销售价
     */
    @NotNull(message = "销售价不能为空")
    @DecimalMin(value = "0.01", message = "销售价必须大于0")
    private BigDecimal salePrice;

    /**
     * 库存数量
     */
    @Min(value = 0, message = "库存数量不能小于0")
    private Integer stockQuantity;

    /**
     * 最小库存预警值
     */
    @Min(value = 0, message = "最小库存不能小于0")
    private Integer minStock;

    /**
     * 最大库存
     */
    @Min(value = 1, message = "最大库存必须大于0")
    private Integer maxStock;

    /**
     * 商品图片URL
     */
    @Size(max = 500, message = "图片URL不能超过500个字符")
    private String imageUrl;

    /**
     * 商品描述
     */
    private String description;

    /**
     * 状态：1-在售，0-下架，2-缺货
     */
    private Integer status;

    /**
     * 是否热销：1-是，0-否
     */
    private Integer isHot;

    /**
     * 是否新品：1-是，0-否
     */
    private Integer isNew;

    /**
     * 销售数量
     */
    private Integer salesCount;

    /**
     * 浏览次数
     */
    private Integer viewCount;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * 获取状态文本
     */
    /**
     * 获取状态文本
     */
    public String getStatusText() {
        try {
            if (this.status == null) {
                return "未知";
            }
            return switch (this.status) {
                case 1 -> "在售";
                case 0 -> "下架";
                case 2 -> "缺货";
                default -> "未知";
            };
        } catch (Exception e) {
            // 防御性处理：即使 status 是非法值（如 Integer.MAX_VALUE），也不崩溃
            return "未知";
        }
    }

    /**
     * 获取库存状态
     */
    public String getStockStatus() {
        try {
            Integer stock = this.stockQuantity;
            Integer min = this.minStock;

            if (stock == null || min == null) {
                return "未知";
            }

            if (stock == 0) {
                return "缺货";
            }
            if (stock < 0) {
                return "库存异常";
            }
            if (stock < min) {
                return "库存不足";
            }
            return "正常";
        } catch (Exception e) {
            return "未知";
        }
    }

    /**
     * 判断是否库存不足
     */
    public boolean isLowStock() {
        try {
            Integer stock = this.stockQuantity;
            Integer min = this.minStock;

            if (stock == null || min == null) {
                return false; // 无法判断，视为不低
            }

            return stock >= 0 && stock < min;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 计算利润率（已优化）
     */
    public BigDecimal getProfitRate() {
        try {
            BigDecimal sp = this.salePrice;
            BigDecimal pp = this.purchasePrice;

            if (sp == null || pp == null || pp.compareTo(BigDecimal.ZERO) <= 0) {
                return BigDecimal.ZERO;
            }

            // 防止极端值导致计算溢出（虽然 BigDecimal 很安全，但 divide 可能抛异常）
            return sp.subtract(pp)
                    .divide(pp, 4, RoundingMode.HALF_UP)
                    .multiply(BigDecimal.valueOf(100));
        } catch (ArithmeticException | NumberFormatException | NullPointerException e) {
            // 捕获所有可能的数值计算异常
            return BigDecimal.ZERO;
        } catch (Exception e) {
            // 兜底：任何未预期异常都返回 0
            return BigDecimal.ZERO;
        }
    }

}